///////////////////////////////////////////////////////////////////////
//
// NO_Definition.h
//
///////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////
#ifndef NO_Definition_H
#define NO_Definition_H

//////////////////////////////////////////////////////////////////////////
#include "NO_Includes.h"

//////////////////////////////////////////////////////////////////////////
// definition
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_NoneDefinition
{
protected:
	//////////////////////////////////////////////////////////////////////////
	void defineImpl(const NO_Int8*, NO_Plugin&);
	void undefineImpl(void);
};

//////////////////////////////////////////////////////////////////////////
template<class T>
class NO_Definition
{
protected:
	//////////////////////////////////////////////////////////////////////////
	void defineImpl(const NO_Int8* n, NO_Plugin& p)
	{
		NO_TypeImp<T*,					
		NO_POINTER_TYPE,
		NO_Sizing<T*>,						
		NO_Naming,						
		NO_NoneDefinition,				
		NO_PointerReferencer<T>,			
		NO_PointerTransform<T> >::define((std::string(n)+" *").c_str(),p);
	}

	//////////////////////////////////////////////////////////////////////////
	void undefineImpl(void)	{}
};

//////////////////////////////////////////////////////////////////////////
// naming
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_Naming
{
protected:
	//////////////////////////////////////////////////////////////////////////
	void setNameImpl(NO_Int8 const * n);
	std::string const & getNameImpl(void) const;

	//////////////////////////////////////////////////////////////////////////
	std::string name;
};

//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_NoneNaming
{
protected:
	//////////////////////////////////////////////////////////////////////////
	void setNameImpl(const NO_Int8* n);
	std::string const & getNameImpl(void) const;

	//////////////////////////////////////////////////////////////////////////
	static std::string name;
};


//////////////////////////////////////////////////////////////////////////
// sizing
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_NoneSizing
{
protected:
	NO_UInt32 getSizeImpl(void)	const;
};

//////////////////////////////////////////////////////////////////////////
template<class T>
class NO_Sizing
{
protected:
	NO_UInt32 getSizeImpl(void) const {return sizeof(T);}
};

#endif
